<?php
/*******************************************
 *  描述: 异常和错误对象类
 *  作者: fenghao
 *  创建: 2012-02-23
 *  更新: 2013-01-15
 *******************************************/

/**
 * PHP 5 基础类描述
class Exception
{
    protected $message = 'Unknown exception';   // 异常信息
    protected $code = 0;                        // 用户自定义异常代码
    protected $file;                            // 发生异常的文件名
    protected $line;                            // 发生异常的代码行号

    function __construct($message = null, $code = 0);

    final function getMessage();                // 返回异常信息
    final function getCode();                   // 返回异常代码
    final function getFile();                   // 返回发生异常的文件名
    final function getLine();                   // 返回发生异常的代码行号
    final function getTrace();                  // backtrace() 数组
    final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息

    //可重载的方法
    function __toString();                       // 可输出的字符串
}
*/



/**
 * MCPHP 框架异常类
 * 用途：1、将异常记录在log/MCPHP_Error.log文件中。
 *          格式为 [日期 时间][发生异常的文件名][发生异常的代码行号][异常信息]
 *          对于类似mysql操作、文件读写操作等类，会自行记录相应的log
 *       2、显示相应的提示信息
 *
 */


class MC_Exception extends Exception
{ 

    /**
     * 异常类构造函数
     *
     * @param string $message 错误消息
     * @param int $code 错误代码
     * @return void
     */
    public function __construct($message, $code = 0) {
        parent::__construct($message, $code);
        //ErrorMsg::fnErrMsg($message);
        //记录异常log
        //$_log_path = ROOT_DIR.DS.$_SERVER['MCPHP_CONFIG']['Log']['Log_dir'].DS.'MCPHP_Error.log';
        //$_log_path = ROOT_DIR.DS.__get_config('Log.Log_dir').DS.'MCPHP_Error.log';
        //用于使用非mcphp框架内的文件测试使用
        //if(!is_file($_log_path)) $_log_path='log/do_test_error.log';
        //$_log = '['.date("Y-m-d H:i:s").']['.$this->getFile().' ('.$this->getLine().'): '.$message."\n";
        //error_log($_log, 3, $_log_path); 
        if(defined('MC_ROOT_DIR')){
			$_log_path = MC_ROOT_DIR.DS.__get_config('Log.Log_dir').DS.'MCPHP_Error.log';
			//用于使用非mcphp框架内的文件测试使用
			if(!is_file($_log_path)) $_log_path=MC_ROOT_DIR.DS.'log/do_test_error.log';
			$_log = '['.date("Y-m-d H:i:s").']['.$this->getFile().' ('.$this->getLine().'): '.$message."\n";
			error_log($_log, 3, $_log_path); 
		}
    }

    /**
     * 自定义输出格式
     *
     * @param void
     * @return string
     */
    public function __toString() {
        return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
    }


    /**
     * 跳转函数
     *
     * @param string $url 需要跳转的目标URL
     * @param string $msg 如果需要在页面里提示消息
     * @return unknown
     */
    public function redirect($url = '/', $msg = ''){
        if (headers_sent()){
            return $this->go($url, $msg);
        }
        header("Location: $url");
        exit;
    }

    /**
     * HTML跳转
     *
     * @param string $path 需要跳转到的目标URL
     * @return bool
     */
    public function go($url = '', $msg = ''){
        $html =<<<EOT
<html>
<head>
<script type="text/javascript">
<!--
var url = "{$url}";
var msg = "{$msg}";
if (msg != '') alert(msg);
if (url == '') window.history.back();
else window.location.href = url;
-->
</script>
</head>
<body></body>
</html>
EOT;
        echo $html;
        exit;
    }


}



